package com.yiqiniu.easytrans.log;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import com.yiqiniu.easytrans.config.EasyTransConifg;
import com.yiqiniu.easytrans.master.EasyTransMasterSelector;
import com.yiqiniu.easytrans.util.NamedThreadFactory;
public class TransactionLogCleanJob {
@Resource
private EasyTransConifg config;
@Resource
private EasyTransMasterSelector master;
@Resource
private TransactionLogWritter logWritter;
private Logger LOG = LoggerFactory.getLogger(this.getClass());
@PostConstruct
public void init(){
String days = config.getExtendConfig("translog.clean.before.days");
if(StringUtils.isEmpty(days)){
LOG.warn("translog.clean.before.days not set. do not execute clean job");
return;
}
String cleanTime = config.getExtendConfig("translog.clean.time").trim();
final Integer cleanLogDaysRestriction = Integer.valueOf(days);
Date nextExeucteTime = calcNextExecuteTime(cleanTime);
long initialDelay = nextExeucteTime.getTime() - System.currentTimeMillis();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("CleanLogJob",true));
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try{
if(master.hasLeaderShip()){
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, -cleanLogDaysRestriction);
LOG.info("START CLEAN EXPIRED TRANSACTION LOGS.DAYS:" + cleanLogDaysRestriction);
logWritter.cleanFinishedLogs(config.getAppId(), instance.getTime());
LOG.info("END CLEAN EXPIRED TRANSACTION LOGS.DAYS");
}else{
LOG.info("NOT MASTER,do not execute transaction log clean job");
}
}catch(Exception e){
LOG.error("execute clean job error!",e);
}
}
}, initialDelay, 24l*60*60*1000 , TimeUnit.MILLISECONDS);
}
private static Date calcNextExecuteTime(String cleanTime) {
SimpleDateFormat dayFormatter = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat wholeFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date nextExeucteTime;
try {
String dayString = dayFormatter.format(new Date());
nextExeucteTime = wholeFormatter.parse(dayString + " " + cleanTime);
} catch (ParseException e) {
throw new RuntimeException(e);
}
if(nextExeucteTime.getTime() < System.currentTimeMillis()){
Calendar instance = Calendar.getInstance();
instance.setTime(nextExeucteTime);
instance.add(Calendar.DATE, 1);
nextExeucteTime = instance.getTime();
}
return nextExeucteTime;
}
}